import BaseVenueProcessor from './BaseVenueProcessor.js';
import { getYuanFengVenueSettings } from '../request.js';

/**
 * 源峰网球场地数据处理器
 */
export class YuanFengProcessor extends BaseVenueProcessor {
  constructor() {
    super();
    this.venueName = '源峰网球';
  }

  /**
   * 获取源峰网球场地预约设置
   * @param {Object} params - 查询参数 { userId, projectUid, dateTime }
   * @returns {Promise} 请求Promise
   */
  async getVenueSettings(params = {}) {
    // 设置默认参数
    const defaultParams = {
      userId: 5871935,
      projectUid: "1747877670713849594",
      dateTime: "2025-08-20"
    };
    
    // 合并参数
    const requestData = { ...defaultParams, ...params };
    
    return await getYuanFengVenueSettings(requestData);
  }

  /**
   * 验证数据是否有效
   * @param {Object} data - 原始场地数据
   * @returns {boolean} 数据是否有效
   */
  validateData(data) {
    // 处理两种不同的数据格式
    // 格式1: data包含result属性，result属性包含slots
    // 格式2: data直接包含slots
    const actualData = data.result || data;
    
    return actualData && 
           actualData.slots && 
           Array.isArray(actualData.slots) &&
           actualData.slots.length > 0;
  }

  /**
   * 按场地名称分组
   * @param {Object} data - 原始场地数据
   * @returns {Map} 场地Map
   */
  groupVenues(data) {
    const venueMap = new Map();
    
    // 处理两种不同的数据格式
    const actualData = data.result || data;
    
    // 遍历所有场地，按classRoomName分组
    actualData.slots.forEach(slot => {
      const venueName = slot.classRoomName;
      
      if (!venueMap.has(venueName)) {
        venueMap.set(venueName, {
          name: venueName,
          siteId: slot.classroomUid, // 使用classroomUid作为siteId
          timeSlots: []
        });
      }
    });
    
    return venueMap;
  }

  /**
   * 处理时间槽
   * @param {Map} venueMap - 场地Map
   * @param {Object} data - 原始场地数据
   */
  processTimeSlots(venueMap, data) {
    // 处理两种不同的数据格式
    const actualData = data.result || data;
    
    // 遍历时间槽数据
    actualData.slots.forEach(slot => {
      const venueName = slot.classRoomName;
      const venue = venueMap.get(venueName);
      
      if (venue) {
        const beginDatetime = slot.beginDatetime;
        const endDatetime = slot.endDatetime;
        const timeSlot = `${beginDatetime.substring(11, 16)}-${endDatetime.substring(11, 16)}`;
        
        // 添加时间槽信息
        venue.timeSlots.push({
          time: timeSlot,
          isFree: slot.apptInfo.status === 0 || slot.apptInfo.status === 1, // status为0或1表示可预约
          price: slot.cost,
          beginDatetime: beginDatetime,
          endDatetime: endDatetime
        });
      }
    });
  }

  /**
   * 转换为场地列表
   * @param {Map} venueMap - 场地Map
   * @returns {Array} 场地列表
   */
  convertToVenueList(venueMap) {
    return Array.from(venueMap.values()).map((venue, index) => {
      // 根据场地名称确定地址和经纬度
      let address, latitude, longitude;
      
      if (venue.name.includes('茶山丽江豪园')) {
        address = '广东省东莞市茶山镇丽江豪园源峰网球';
        latitude = 23.088813;
        longitude = 113.842815;
      } else if (venue.name.includes('茶山方中酒店')) {
        address = '广东省东莞市茶山镇方中假日酒店源峰网球';
        latitude = 23.082830;
        longitude = 113.856749;
      } else if (venue.name.includes('石碣黄泗围公园')) {
        address = '广东省东莞市石碣镇黄泗围公园源峰网球';
        latitude = 23.122768;
        longitude = 113.820772;
      } else {
        // 默认使用第一个地址
        address = '广东省东莞市茶山镇丽江豪园源峰网球';
        latitude = 23.088813;
        longitude = 113.842815;
      }
      
      return {
        id: venue.siteId, // 使用siteId作为ID
        name: venue.name,
        address: address,
        latitude: latitude,
        longitude: longitude,
        phone: '0769-33445566',
        rating: 4.6,
        price: 0,
        facilities: ['网球场'],
        image: '',
        distance: 18.7,
        timeSlots: venue.timeSlots,
        dataSource: this.venueName,
        description: '网球场'
      };
    });
  }

  /**
   * 处理场地数据
   * @param {Object} data - 原始场地数据
   * @param {Date} selectedDate - 选择的日期
   * @returns {Array} 处理后的场地列表
   */
  process(data, selectedDate) {
    this.selectedDate = selectedDate;
    if (!this.validateData(data)) {
      console.error('源峰网球数据验证失败');
      return [];
    }
    
    const venueMap = this.groupVenues(data);
    this.processTimeSlots(venueMap, data);
    return this.convertToVenueList(venueMap);
  }
}

export default YuanFengProcessor;